home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7y3.s < prev    next >
Text File  |  1994-11-28  |  9KB  |  367 lines

  1.  
  2. ; Lezione7y3.s    DUE UTILIZZI DI UNO SPRITE SULLA STESSA RIGA
  3.  
  4. ;       Questo esempio mostra come sia possibile riutilizzare uno sprite
  5. ;       2 volte su una stessa riga accedendo direttamente ai registri
  6.  
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ;    Puntiamo la PIC "vuota"
  20.  
  21.     MOVE.L    #BITPLANE,d0    ; dove puntare
  22.     LEA    BPLPOINTERS,A1    ; puntatori COP
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.  
  27. ;    NON Puntiamo lo sprite !!!!!!!!!!!!!!!!!!!!
  28.  
  29.     move.l    #COPPERLIST,$dff080    ; nostra COP
  30.     move.w    d0,$dff088        ; START COP
  31.     move.w    #0,$dff1fc        ; NO AGA!
  32.     move.w    #$c00,$dff106        ; NO AGA!
  33.  
  34. mouse:
  35.     btst    #6,$bfe001    ; mouse premuto?
  36.     bne.s    mouse
  37.  
  38.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  39.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  40.  
  41.     move.l    4.w,a6
  42.     jsr    -$7e(a6)    ; Enable
  43.     move.l    gfxbase(PC),a1
  44.     jsr    -$19e(a6)    ; Closelibrary
  45.     rts
  46.  
  47. ;    Dati
  48.  
  49. GfxName:
  50.     dc.b    "graphics.library",0,0
  51.  
  52. GfxBase:
  53.     dc.l    0
  54.  
  55. OldCop:
  56.     dc.l    0
  57.  
  58.  
  59.     SECTION    GRAPHIC,DATA_C
  60.  
  61. COPPERLIST:
  62. SpritePointers:
  63.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  64.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  65.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  66.     dc.w    $13e,0
  67.  
  68.     dc.w    $8E,$2c81    ; DiwStrt
  69.     dc.w    $90,$2cc1    ; DiwStop
  70.     dc.w    $92,$38        ; DdfStart
  71.     dc.w    $94,$d0        ; DdfStop
  72.     dc.w    $102,0        ; BplCon1
  73.     dc.w    $104,0        ; BplCon2
  74.     dc.w    $108,0        ; Bpl1Mod
  75.     dc.w    $10a,0        ; Bpl2Mod
  76.  
  77.             ; 5432109876543210
  78.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  79.  
  80. BPLPOINTERS:
  81.     dc.w $e0,0,$e2,0    ;primo     bitplane
  82.  
  83.     dc.w    $180,$000    ; color0    ; sfondo nero
  84.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  85.                         ; in questo caso e' vuoto,
  86.                         ; per cui non compare.
  87.  
  88.     dc.w    $1A2,$FF0    ; color17, ossia COLOR1 dello sprite0 - GIALLO
  89.     dc.w    $1A4,$a00    ; color18, ossia COLOR2 dello sprite0 - ROSSO
  90.     dc.w    $1A6,$F70    ; color19, ossia COLOR3 dello sprite0 - ARANCIO
  91.  
  92. ; ---> inserite qua il pezzo di copperlist riportato in fondo al commento
  93.  
  94.     dc.w    $4007,$fffe    ; aspetta la linea $40, posizione orizz. 7
  95.     dc.w    $140,$0060    ; SPR0POS - posizione orizzontale
  96.     dc.w    $142,$0000    ; SPR0CTL
  97.     dc.w    $146,$0e70    ; SPR0DATB
  98.     dc.w    $144,$03c0    ; SPR0DATA - attiva lo sprite
  99.  
  100.     dc.w    $4087,$fffe    ; aspetta la linea $40, posizione orizz. 87
  101.     dc.w    $140,$00a0    ; SPR0POS - posizione orizzontale
  102.  
  103. ; lo stesso per la linea $41
  104.     dc.w    $4107,$fffe    ; wait pos. orizzontale 07
  105.     dc.w    $140,$0060    ; spr0pos
  106.  
  107.     dc.w    $4187,$fffe    ; wait pos. orizzontale 87
  108.     dc.w    $140,$00a0    ; spr0pos
  109.  
  110. ; lo stesso per la linea $42
  111.     dc.w    $4207,$fffe    ; wait
  112.     dc.w    $140,$0060    ; spr0pos
  113.  
  114.     dc.w    $4287,$fffe    ; wait... eccetera
  115.     dc.w    $140,$00a0
  116.  
  117. ; lo stesso per la linea $43
  118.     dc.w    $4307,$fffe
  119.     dc.w    $140,$0060
  120.  
  121.     dc.w    $4387,$fffe
  122.     dc.w    $140,$00a0
  123.  
  124. ; lo stesso per la linea $44
  125.     dc.w    $4407,$fffe
  126.     dc.w    $140,$0060
  127.  
  128.     dc.w    $4487,$fffe
  129.     dc.w    $140,$00a0
  130.  
  131. ; lo stesso per la linea $45
  132.     dc.w    $4507,$fffe
  133.     dc.w    $140,$0060
  134.  
  135.     dc.w    $4587,$fffe
  136.     dc.w    $140,$00a0
  137.  
  138. ; lo stesso per la linea $46
  139.     dc.w    $4607,$fffe
  140.     dc.w    $140,$0060
  141.  
  142.     dc.w    $4687,$fffe
  143.     dc.w    $140,$00a0
  144.  
  145. ; lo stesso per la linea $47
  146.     dc.w    $4707,$fffe
  147.     dc.w    $140,$0060
  148.  
  149.     dc.w    $4787,$fffe
  150.     dc.w    $140,$00a0
  151.  
  152. ; lo stesso per la linea $48
  153.     dc.w    $4807,$fffe
  154.     dc.w    $140,$0060
  155.  
  156.     dc.w    $4887,$fffe
  157.     dc.w    $140,$00a0
  158.  
  159. ; lo stesso per la linea $49
  160.     dc.w    $4907,$fffe
  161.     dc.w    $140,$0060
  162.  
  163.     dc.w    $4987,$fffe
  164.     dc.w    $140,$00a0
  165.  
  166. ; lo stesso per la linea $4a
  167.     dc.w    $4a07,$fffe
  168.     dc.w    $140,$0060
  169.  
  170.     dc.w    $4a87,$fffe
  171.     dc.w    $140,$00a0
  172.  
  173. ; lo stesso per la linea $4b
  174.     dc.w    $4b07,$fffe
  175.     dc.w    $140,$0060
  176.  
  177.     dc.w    $4b87,$fffe
  178.     dc.w    $140,$00a0
  179.  
  180. ; lo stesso per la linea $4c
  181.     dc.w    $4c07,$fffe
  182.     dc.w    $140,$0060
  183.  
  184.     dc.w    $4c87,$fffe
  185.     dc.w    $140,$00a0
  186.  
  187. ; lo stesso per la linea $4d
  188.     dc.w    $4d07,$fffe
  189.     dc.w    $140,$0060
  190.  
  191.     dc.w    $4d87,$fffe
  192.     dc.w    $140,$00a0
  193.  
  194. ; lo stesso per la linea $4e
  195.     dc.w    $4e07,$fffe
  196.     dc.w    $140,$0060
  197.  
  198.     dc.w    $4e87,$fffe
  199.     dc.w    $140,$00a0
  200.  
  201. ; lo stesso per la linea $4f
  202.     dc.w    $4f07,$fffe
  203.     dc.w    $140,$0060
  204.  
  205.     dc.w    $4f87,$fffe
  206.     dc.w    $140,$00a0
  207.  
  208.     dc.w    $5007,$fffe    ; aspetta la linea $50
  209.     dc.w    $142,$0000    ; SPR0CTL - "spegne" lo sprite
  210.  
  211.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  212.  
  213.  
  214.  
  215.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  216.                     ; perche' per vedere gli sprite
  217.                     ; e' necessario che ci siano bitplanes
  218.                     ; abilitati
  219. BITPLANE:
  220.     ds.b    40*256        ; bitplane azzerato lowres
  221.  
  222.     end
  223.  
  224. Manipolare direttamente i registri rende anche possibile disegnare uno sprite
  225. due volte sulla stessa riga, ovvero disegnarlo in due diverse posizioni
  226. orizzontali. Il trucco fa uso del copper e della sua capacita` di aspettare
  227. che il pennello elettronico abbia raggiunto una determinata posizione sul
  228. video. All'inizio si aspetta con il copper la prima riga dello schermo in cui
  229. si vuole disegnare lo sprite. Nell'esempio aspettiamo la riga $40 mettendo
  230. nella copperlist:
  231.  
  232.     dc.w    $4007,$fffe    ; aspetta la linea $40, posizione orizz. 7
  233.  
  234.  Poi si caricano i registri SPR0CTL, SPRDATB e SPRDAT:
  235.  
  236.     dc.w    $142,$0000    ; SPR0CTL
  237.     dc.w    $146,$0e70    ; SPR0DATB
  238.     dc.w    $144,$03c0    ; SPR0DATA - attiva lo sprite
  239.  
  240. E si mette il primo valore della posizione orizzontale in SPRxPOS:
  241.  
  242.     dc.w    $140,$0060    ; SPR0POS - posizione orizzontale
  243.  
  244. A questo punto si aspetta che il pennello elettronico superi questa posizione
  245. orizzontale, in modo che lo sprite venga disegnato.
  246.  
  247.     dc.w    $4087,$fffe    ; aspetta la linea $40, posizione orizz. 87
  248.  
  249. Nell'esempio la posizione orizzontale dello sprite e` $60. Aspettando
  250. la posizione $87 siamo abbondantemente sicuri che lo sprite e` stato
  251. disegnato. Infatti quando il pennello elettronico ha superato la posizione
  252. orizzontale, lo sprite e` stato effettivamente disegnato.
  253.  
  254. Una volta avvenuto cio`, si scrive la seconda posizione orizzontale
  255. in SPRxPOS.
  256.  
  257.     dc.w    $140,$00a0    ; SPR0POS - posizione orizzontale
  258.  
  259. In questo modo lo sprite verra` disegnato anche nella seconda
  260. posizione orizzontale. A questo punto abbiamo disegnato 2 volte lo stesso
  261. sprite su una riga. Per disegnare i 2 sprite sulle righe seguenti,
  262. e` sufficente ripetere tutti i passi fin qui descritti.
  263. Per esempio per la riga $41 scriviamo
  264.  
  265. ; lo stesso per la linea $41
  266.     dc.w    $4107,$fffe
  267.     dc.w    $140,$0060
  268.  
  269.     dc.w    $4187,$fffe
  270.     dc.w    $140,$00a0
  271.  
  272. che e` la stessa cosa della riga $40, solo che teniamo costanti SPR0DATA
  273. SPR0DATB e SPR0CTL in modo da tenere costante la forma dello sprite.
  274. Volendo si possono variare questi registri per cambiare la forma dello sprite
  275. tra una riga e l'altra.
  276.  
  277. Per disabilitare gli sprite basta scrivere un qualsiasi valore in 
  278. SPL0CTL, in questo modo:
  279.  
  280.     dc.w    $5007,$fffe    ; aspetta la linea $50
  281.     dc.w    $142,$0000    ; SPR0CTL - "spegne" lo sprite
  282.  
  283.  
  284. Se proprio voleste esagerare, potete anche cambiare la palette orizzontalmente
  285. tra la prima barra e la seconda, in modo da avere riutilizzi sulla stessa
  286. linea anche di colore diverso. Provate ad inserire questa copperlist nel
  287. punto indicato con:
  288.  
  289. ; ---> inserite qua il pezzo di copperlist riportato in fondo al commento
  290.  
  291. Nella copperlist del listato. In pratica sostituiamo la parte finale che si
  292. occupa di visualizzare lo sprite. (Amiga+b+c+i per copiare il testo)
  293.  
  294.  
  295.     dc.w    $4007,$fffe    ; aspetta la linea $40, posizione orizz. 7
  296.     dc.w    $140,$0060    ; SPR0POS - posizione orizzontale
  297.     dc.w    $142,$0000    ; SPR0CTL
  298.     dc.w    $146,$0e70    ; SPR0DATB
  299.     dc.w    $144,$03c0    ; SPR0DATA - attiva lo sprite
  300.  
  301.     dc.w    $4087,$fffe    ; aspetta la linea $40, posizione orizz. 87
  302.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  303.     dc.w    $1A4,$050    ; color18
  304.     dc.w    $1A6,$0a0    ; color19
  305.     dc.w    $140,$00a0    ; SPR0POS - posizione orizzontale
  306.  
  307. ; linea $41
  308.     dc.w    $4107,$fffe    ; wait pos. orizzontale 07
  309.     dc.w    $1A2,$FF0    ; color17    ; tono arancio
  310.     dc.w    $1A4,$a00    ; color18
  311.     dc.w    $1A6,$F70    ; color19
  312.     dc.w    $140,$0060    ; spr0pos
  313.     dc.w    $4187,$fffe    ; wait pos. orizzontale 87
  314.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  315.     dc.w    $1A4,$050    ; color18
  316.     dc.w    $1A6,$0a0    ; color19
  317.     dc.w    $140,$00a0    ; spr0pos
  318. ; linea $42
  319.     dc.w    $4207,$fffe    ; wait pos. orizzontale 07
  320.     dc.w    $1A2,$FF0    ; color17    ; tono arancio
  321.     dc.w    $1A4,$a00    ; color18
  322.     dc.w    $1A6,$F70    ; color19
  323.     dc.w    $140,$0060    ; spr0pos
  324.     dc.w    $4287,$fffe    ; wait pos. orizzontale 87
  325.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  326.     dc.w    $1A4,$050    ; color18
  327.     dc.w    $1A6,$0a0    ; color19
  328.     dc.w    $140,$00a0    ; spr0pos
  329. ; linea $43
  330.     dc.w    $4307,$fffe    ; wait pos. orizzontale 07
  331.     dc.w    $1A2,$FF0    ; color17    ; tono arancio
  332.     dc.w    $1A4,$a00    ; color18
  333.     dc.w    $1A6,$F70    ; color19
  334.     dc.w    $140,$0060    ; spr0pos
  335.     dc.w    $4387,$fffe    ; wait pos. orizzontale 87
  336.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  337.     dc.w    $1A4,$050    ; color18
  338.     dc.w    $1A6,$0a0    ; color19
  339.     dc.w    $140,$00a0    ; spr0pos
  340. ; linea $44
  341.     dc.w    $4407,$fffe    ; wait pos. orizzontale 07
  342.     dc.w    $1A2,$FF0    ; color17    ; tono arancio
  343.     dc.w    $1A4,$a00    ; color18
  344.     dc.w    $1A6,$F70    ; color19
  345.     dc.w    $140,$0060    ; spr0pos
  346.     dc.w    $4487,$fffe    ; wait pos. orizzontale 87
  347.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  348.     dc.w    $1A4,$050    ; color18
  349.     dc.w    $1A6,$0a0    ; color19
  350.     dc.w    $140,$00a0    ; spr0pos
  351. ; linea $45
  352.     dc.w    $4507,$fffe    ; wait pos. orizzontale 07
  353.     dc.w    $1A2,$FF0    ; color17    ; tono arancio
  354.     dc.w    $1A4,$a00    ; color18
  355.     dc.w    $1A6,$F70    ; color19
  356.     dc.w    $140,$0060    ; spr0pos
  357.     dc.w    $4587,$fffe    ; wait pos. orizzontale 87
  358.     dc.w    $1A2,$aFa    ; color17    ; tono verde
  359.     dc.w    $1A4,$050    ; color18
  360.     dc.w    $1A6,$0a0    ; color19
  361.     dc.w    $140,$00a0    ; spr0pos
  362.  
  363.     dc.w    $4607,$fffe    ; aspetta la linea $46
  364.     dc.w    $142,$0000    ; SPR0CTL - "spegne" lo sprite
  365.     dc.w    $ffff,$fffe    ; fine copperlist
  366.  
  367.